{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Course Project: Trading Strategy based on PCA\n",
    "\n",
    "Welcome to your course project. This exercise gives you a hands-on experience to use PCA to:\n",
    "\n",
    "- construct eigen-portfolios\n",
    "- implement a measure of market systemic risk\n",
    "- develop simple trading strategy\n",
    "\n",
    "**Instructions:**\n",
    "- You will be using Python 3.\n",
    "- Avoid using for-loops and while-loops, unless you are explicitly told to do so.\n",
    "- Do not modify the (# GRADED FUNCTION [function name]) comment in some cells. Your work would not be graded if you change this. Each cell containing that comment should only contain one function.\n",
    "- After coding your function, run the cell right below it to check if your result is correct.\n",
    "\n",
    "**After this assignment you will:**\n",
    "- Be able to use PCA to construct eigen-portfolios\n",
    "- Be able to use PCA to calculate a measure of market systemic risk\n",
    "- Be able to implement and analyze performance of portfolio strategy\n",
    "\n",
    "Let's get started!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## About iPython Notebooks ##\n",
    "\n",
    "iPython Notebooks are interactive coding environments embedded in a webpage. You will be using iPython notebooks in this class. You only need to write code between the ### START CODE HERE ### and ### END CODE HERE ### comments. After writing your code, you can run the cell by either pressing \"SHIFT\"+\"ENTER\" or by clicking on \"Run Cell\" (denoted by a play symbol) in the upper bar of the notebook. \n",
    "\n",
    "We will often specify \"(≈ X lines of code)\" in the comments to tell you about how much code you need to write. It is just a rough estimate, so don't feel bad if your code is longer or shorter."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1 - Packages ##\n",
    "\n",
    "First, let's run the cell below to import all the packages that you will need during this assignment. \n",
    "- [numpy](www.numpy.org) is the fundamental package for scientific computing with Python.\n",
    "- [pandas](http://pandas.pydata.org/) Python data analysis library\n",
    "- [pandas](http://scikit-learn.org/stable/) scikit-learn - machine learning in Python.\n",
    "- [matplotlib](http://matplotlib.org) is a famous library to plot graphs in Python."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Package Versions:\n",
      "  scikit-learn: 0.18.1\n",
      "  tensorflow: 1.8.0\n",
      "  pandas: 0.19.2\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import sklearn.decomposition\n",
    "import tensorflow as tf\n",
    "from tensorflow.contrib.layers import fully_connected\n",
    "import sys\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "print(\"Package Versions:\")\n",
    "print(\"  scikit-learn: %s\" % sklearn.__version__)\n",
    "print(\"  tensorflow: %s\" % tf.__version__)\n",
    "\n",
    "sys.path.append(\"..\")\n",
    "import grading\n",
    "\n",
    "try:\n",
    "    import sklearn.model_selection\n",
    "    import sklearn.linear_model\n",
    "except:\n",
    "    print(\"Looks like an older version of sklearn package\")\n",
    "\n",
    "try:\n",
    "    import pandas as pd\n",
    "    print(\"  pandas: %s\"% pd.__version__)\n",
    "except:\n",
    "    print(\"Missing pandas package\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "### ONLY FOR GRADING. DO NOT EDIT ###\n",
    "submissions=dict()\n",
    "assignment_key=\"LztgGBBtEeiaYgrsftMrjA\" \n",
    "all_parts=[\"oZXnf\", \"ahjZa\", \"9tUbW\",\"wjLiO\"]\n",
    "### ONLY FOR GRADING. DO NOT EDIT ###"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# COURSERA_TOKEN = # the key provided to the Student under his/her email on submission page\n",
    "# COURSERA_EMAIL = # the email\n",
    "COURSERA_TOKEN= \" \"\n",
    "COURSERA_EMAIL= \" \""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Dataset:  daily prices of  stocks from S&P 500 index  ####\n",
    "For this exercise we will be working with S&P 500 Index stock prices dataset. \n",
    "The following cell computes returns based for a subset of S&P 500 index stocks. It starts with stocks price data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Asset prices shape (3493, 419)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>AA</th>\n",
       "      <th>AAPL</th>\n",
       "      <th>ABC</th>\n",
       "      <th>ABT</th>\n",
       "      <th>ADBE</th>\n",
       "      <th>ADI</th>\n",
       "      <th>ADM</th>\n",
       "      <th>ADP</th>\n",
       "      <th>ADSK</th>\n",
       "      <th>AEE</th>\n",
       "      <th>AEP</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2000-01-27</th>\n",
       "      <td>46.1112</td>\n",
       "      <td>78.9443</td>\n",
       "      <td>3.9286</td>\n",
       "      <td>4.5485</td>\n",
       "      <td>13.7898</td>\n",
       "      <td>15.6719</td>\n",
       "      <td>48.0313</td>\n",
       "      <td>10.8844</td>\n",
       "      <td>39.5477</td>\n",
       "      <td>8.1250</td>\n",
       "      <td>32.9375</td>\n",
       "      <td>33.5625</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-28</th>\n",
       "      <td>45.8585</td>\n",
       "      <td>77.8245</td>\n",
       "      <td>3.6295</td>\n",
       "      <td>4.5485</td>\n",
       "      <td>14.2653</td>\n",
       "      <td>14.3906</td>\n",
       "      <td>47.7500</td>\n",
       "      <td>10.7143</td>\n",
       "      <td>38.5627</td>\n",
       "      <td>7.7188</td>\n",
       "      <td>32.3125</td>\n",
       "      <td>33.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-31</th>\n",
       "      <td>44.5952</td>\n",
       "      <td>78.0345</td>\n",
       "      <td>3.7054</td>\n",
       "      <td>4.3968</td>\n",
       "      <td>14.5730</td>\n",
       "      <td>13.7656</td>\n",
       "      <td>46.7500</td>\n",
       "      <td>10.6576</td>\n",
       "      <td>37.3807</td>\n",
       "      <td>7.6406</td>\n",
       "      <td>32.5625</td>\n",
       "      <td>33.5000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-02-01</th>\n",
       "      <td>47.8377</td>\n",
       "      <td>80.7640</td>\n",
       "      <td>3.5804</td>\n",
       "      <td>4.5333</td>\n",
       "      <td>14.7128</td>\n",
       "      <td>13.9688</td>\n",
       "      <td>49.0000</td>\n",
       "      <td>10.8844</td>\n",
       "      <td>37.9717</td>\n",
       "      <td>7.9219</td>\n",
       "      <td>32.5625</td>\n",
       "      <td>33.6875</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-02-02</th>\n",
       "      <td>51.5434</td>\n",
       "      <td>83.4934</td>\n",
       "      <td>3.5290</td>\n",
       "      <td>4.5788</td>\n",
       "      <td>14.7968</td>\n",
       "      <td>15.3281</td>\n",
       "      <td>48.1250</td>\n",
       "      <td>10.6576</td>\n",
       "      <td>35.9032</td>\n",
       "      <td>7.9688</td>\n",
       "      <td>32.5625</td>\n",
       "      <td>33.6250</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                  A       AA    AAPL     ABC      ABT     ADBE      ADI  \\\n",
       "2000-01-27  46.1112  78.9443  3.9286  4.5485  13.7898  15.6719  48.0313   \n",
       "2000-01-28  45.8585  77.8245  3.6295  4.5485  14.2653  14.3906  47.7500   \n",
       "2000-01-31  44.5952  78.0345  3.7054  4.3968  14.5730  13.7656  46.7500   \n",
       "2000-02-01  47.8377  80.7640  3.5804  4.5333  14.7128  13.9688  49.0000   \n",
       "2000-02-02  51.5434  83.4934  3.5290  4.5788  14.7968  15.3281  48.1250   \n",
       "\n",
       "                ADM      ADP    ADSK      AEE      AEP  \n",
       "2000-01-27  10.8844  39.5477  8.1250  32.9375  33.5625  \n",
       "2000-01-28  10.7143  38.5627  7.7188  32.3125  33.0000  \n",
       "2000-01-31  10.6576  37.3807  7.6406  32.5625  33.5000  \n",
       "2000-02-01  10.8844  37.9717  7.9219  32.5625  33.6875  \n",
       "2000-02-02  10.6576  35.9032  7.9688  32.5625  33.6250  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import os\n",
    "# load dataset\n",
    "\n",
    "asset_prices = pd.read_csv(os.getcwd() + '/data/spx_holdings_and_spx_closeprice.csv',\n",
    "                     date_parser=lambda dt: pd.to_datetime(dt, format='%Y-%m-%d'),\n",
    "                     index_col = 0).dropna()\n",
    "n_stocks_show = 12\n",
    "print('Asset prices shape', asset_prices.shape)\n",
    "asset_prices.iloc[:, :n_stocks_show].head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Calculate daily log-returns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>AA</th>\n",
       "      <th>AAPL</th>\n",
       "      <th>ABC</th>\n",
       "      <th>ABT</th>\n",
       "      <th>ADBE</th>\n",
       "      <th>ADI</th>\n",
       "      <th>ADM</th>\n",
       "      <th>ADP</th>\n",
       "      <th>ADSK</th>\n",
       "      <th>AEE</th>\n",
       "      <th>AEP</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2000-01-28</th>\n",
       "      <td>-0.005480</td>\n",
       "      <td>-0.014185</td>\n",
       "      <td>-0.076134</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.034482</td>\n",
       "      <td>-0.081758</td>\n",
       "      <td>-0.005857</td>\n",
       "      <td>-0.015628</td>\n",
       "      <td>-0.024907</td>\n",
       "      <td>-0.049994</td>\n",
       "      <td>-0.018975</td>\n",
       "      <td>-0.016760</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-31</th>\n",
       "      <td>-0.027548</td>\n",
       "      <td>0.002698</td>\n",
       "      <td>0.020912</td>\n",
       "      <td>-0.033352</td>\n",
       "      <td>0.021570</td>\n",
       "      <td>-0.043431</td>\n",
       "      <td>-0.020942</td>\n",
       "      <td>-0.005292</td>\n",
       "      <td>-0.030651</td>\n",
       "      <td>-0.010131</td>\n",
       "      <td>0.007737</td>\n",
       "      <td>0.015152</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-02-01</th>\n",
       "      <td>0.072710</td>\n",
       "      <td>0.034978</td>\n",
       "      <td>-0.033735</td>\n",
       "      <td>0.031045</td>\n",
       "      <td>0.009593</td>\n",
       "      <td>0.014761</td>\n",
       "      <td>0.048128</td>\n",
       "      <td>0.021281</td>\n",
       "      <td>0.015810</td>\n",
       "      <td>0.036816</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.005597</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-02-02</th>\n",
       "      <td>0.077464</td>\n",
       "      <td>0.033795</td>\n",
       "      <td>-0.014356</td>\n",
       "      <td>0.010037</td>\n",
       "      <td>0.005709</td>\n",
       "      <td>0.097310</td>\n",
       "      <td>-0.017857</td>\n",
       "      <td>-0.020837</td>\n",
       "      <td>-0.054475</td>\n",
       "      <td>0.005920</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>-0.001855</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-02-03</th>\n",
       "      <td>0.016340</td>\n",
       "      <td>-0.031014</td>\n",
       "      <td>0.045537</td>\n",
       "      <td>-0.006617</td>\n",
       "      <td>0.005670</td>\n",
       "      <td>0.126402</td>\n",
       "      <td>0.098701</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.067217</td>\n",
       "      <td>0.035288</td>\n",
       "      <td>0.011516</td>\n",
       "      <td>0.033457</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   A        AA      AAPL       ABC       ABT      ADBE  \\\n",
       "2000-01-28 -0.005480 -0.014185 -0.076134  0.000000  0.034482 -0.081758   \n",
       "2000-01-31 -0.027548  0.002698  0.020912 -0.033352  0.021570 -0.043431   \n",
       "2000-02-01  0.072710  0.034978 -0.033735  0.031045  0.009593  0.014761   \n",
       "2000-02-02  0.077464  0.033795 -0.014356  0.010037  0.005709  0.097310   \n",
       "2000-02-03  0.016340 -0.031014  0.045537 -0.006617  0.005670  0.126402   \n",
       "\n",
       "                 ADI       ADM       ADP      ADSK       AEE       AEP  \n",
       "2000-01-28 -0.005857 -0.015628 -0.024907 -0.049994 -0.018975 -0.016760  \n",
       "2000-01-31 -0.020942 -0.005292 -0.030651 -0.010131  0.007737  0.015152  \n",
       "2000-02-01  0.048128  0.021281  0.015810  0.036816  0.000000  0.005597  \n",
       "2000-02-02 -0.017857 -0.020837 -0.054475  0.005920  0.000000 -0.001855  \n",
       "2000-02-03  0.098701  0.000000  0.067217  0.035288  0.011516  0.033457  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "asset_returns = np.log(asset_prices) - np.log(asset_prices.shift(1))\n",
    "asset_returns = asset_prices.pct_change(periods=1)\n",
    "asset_returns = asset_returns.iloc[1:, :]\n",
    "asset_returns.iloc[:, :n_stocks_show].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def center_returns(r_df):\n",
    "    \"\"\"\n",
    "    Normalize, i.e. center and divide by standard deviation raw asset returns data\n",
    "\n",
    "    Arguments:\n",
    "    r_df -- a pandas.DataFrame of asset returns\n",
    "\n",
    "    Return:\n",
    "    normed_df -- normalized returns\n",
    "    \"\"\"\n",
    "    mean_r = r_df.mean(axis=0)\n",
    "    sd_r = r_df.std(axis=0)\n",
    "    normed_df = (r_df - mean_r) / sd_r\n",
    "    return normed_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>AA</th>\n",
       "      <th>AAPL</th>\n",
       "      <th>ABC</th>\n",
       "      <th>ABT</th>\n",
       "      <th>ADBE</th>\n",
       "      <th>ADI</th>\n",
       "      <th>ADM</th>\n",
       "      <th>ADP</th>\n",
       "      <th>ADSK</th>\n",
       "      <th>AEE</th>\n",
       "      <th>AEP</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2000-01-28</th>\n",
       "      <td>-0.190054</td>\n",
       "      <td>-0.513710</td>\n",
       "      <td>-2.714709</td>\n",
       "      <td>-0.049779</td>\n",
       "      <td>2.182933</td>\n",
       "      <td>-2.684131</td>\n",
       "      <td>-0.212461</td>\n",
       "      <td>-0.766996</td>\n",
       "      <td>-1.540731</td>\n",
       "      <td>-1.803947</td>\n",
       "      <td>-1.372991</td>\n",
       "      <td>-0.994169</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-01-31</th>\n",
       "      <td>-0.898232</td>\n",
       "      <td>0.096888</td>\n",
       "      <td>0.688156</td>\n",
       "      <td>-1.757230</td>\n",
       "      <td>1.355644</td>\n",
       "      <td>-1.438899</td>\n",
       "      <td>-0.720771</td>\n",
       "      <td>-0.279098</td>\n",
       "      <td>-1.891884</td>\n",
       "      <td>-0.391433</td>\n",
       "      <td>0.547298</td>\n",
       "      <td>0.871919</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-02-01</th>\n",
       "      <td>2.319164</td>\n",
       "      <td>1.264327</td>\n",
       "      <td>-1.227995</td>\n",
       "      <td>1.539597</td>\n",
       "      <td>0.588289</td>\n",
       "      <td>0.451774</td>\n",
       "      <td>1.606541</td>\n",
       "      <td>0.975244</td>\n",
       "      <td>0.948126</td>\n",
       "      <td>1.272129</td>\n",
       "      <td>-0.008894</td>\n",
       "      <td>0.313197</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-02-02</th>\n",
       "      <td>2.471738</td>\n",
       "      <td>1.221529</td>\n",
       "      <td>-0.548494</td>\n",
       "      <td>0.464060</td>\n",
       "      <td>0.339454</td>\n",
       "      <td>3.133764</td>\n",
       "      <td>-0.616815</td>\n",
       "      <td>-1.012898</td>\n",
       "      <td>-3.348109</td>\n",
       "      <td>0.177340</td>\n",
       "      <td>-0.008894</td>\n",
       "      <td>-0.122594</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2000-02-03</th>\n",
       "      <td>0.510174</td>\n",
       "      <td>-1.122380</td>\n",
       "      <td>1.551619</td>\n",
       "      <td>-0.388563</td>\n",
       "      <td>0.336944</td>\n",
       "      <td>4.078966</td>\n",
       "      <td>3.310577</td>\n",
       "      <td>-0.029293</td>\n",
       "      <td>4.090396</td>\n",
       "      <td>1.217955</td>\n",
       "      <td>0.818989</td>\n",
       "      <td>1.942390</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   A        AA      AAPL       ABC       ABT      ADBE  \\\n",
       "2000-01-28 -0.190054 -0.513710 -2.714709 -0.049779  2.182933 -2.684131   \n",
       "2000-01-31 -0.898232  0.096888  0.688156 -1.757230  1.355644 -1.438899   \n",
       "2000-02-01  2.319164  1.264327 -1.227995  1.539597  0.588289  0.451774   \n",
       "2000-02-02  2.471738  1.221529 -0.548494  0.464060  0.339454  3.133764   \n",
       "2000-02-03  0.510174 -1.122380  1.551619 -0.388563  0.336944  4.078966   \n",
       "\n",
       "                 ADI       ADM       ADP      ADSK       AEE       AEP  \n",
       "2000-01-28 -0.212461 -0.766996 -1.540731 -1.803947 -1.372991 -0.994169  \n",
       "2000-01-31 -0.720771 -0.279098 -1.891884 -0.391433  0.547298  0.871919  \n",
       "2000-02-01  1.606541  0.975244  0.948126  1.272129 -0.008894  0.313197  \n",
       "2000-02-02 -0.616815 -1.012898 -3.348109  0.177340 -0.008894 -0.122594  \n",
       "2000-02-03  3.310577 -0.029293  4.090396  1.217955  0.818989  1.942390  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "normed_r = center_returns(asset_returns)\n",
    "normed_r.iloc[:, :n_stocks_show].head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we are ready to compute Absorption Ratio(AR). We do so by defining a moving look back window over which we collect returns for computing PCA. We start off from the earliest historical data and march forward moving by step_size, which we also choose arbitrary. For each such window we compute PCA and AR, fixing in advance number of components in the enumerator. Specifically, for we use the following hyper-parameters:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Part 1 (Implement exponentially-weighted)\n",
    "\n",
    "**Instructions:**\n",
    "Implement exponent_weighting function which returns a sequence of $w_j$ as np.array. See below:\n",
    "\n",
    "Define sequence of $X_j$ where $j \\subset [N, 0]$, an integer taking all values in the interval from 0 to N  $$ X_j =  e^{-\\frac{log(2)}{H} \\times  \\space j}$$\n",
    "where H is half-life which determines the speed of decay, and $log$ is natural log function\n",
    "Then a sequence of exponentially decaying weights $w_j$ is defined as $$ w_j = \\frac{X_j}{ \\sum\\limits_{j=0}^N X_j } $$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# GRADED FUNCTION: exponent_weighting# GRADE \n",
    "def exponent_weighting(n_periods, half_life = 252):\n",
    "    \"\"\"\n",
    "    Calculate exponentially smoothed normalized (in probability density function sense) weights\n",
    "\n",
    "    Arguments:\n",
    "    n_periods -- number of periods, an integer, N in the formula above\n",
    "    half_life -- half-life, which determines the speed of decay, h in the formula\n",
    "    \n",
    "    Return:\n",
    "    exp_probs -- exponentially smoothed weights, np.array\n",
    "    \"\"\"\n",
    "    \n",
    "    exp_probs = np.zeros(n_periods) # do your own calculation instead of dummy zero array\n",
    "    ### START CODE HERE ### (≈ 3 lines of code)\n",
    "    ### ...\n",
    "    x_j = np.exp( (-np.log(2) / half_life) * np.arange(n_periods))\n",
    "    X = np.sum(np.exp( (-np.log(2) / half_life) * np.arange(n_periods)))\n",
    "    exp_probs = x_j / X\n",
    "    return exp_probs\n",
    "    ### END CODE HERE ###"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7fa2b1a11588>]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nEQnq/wOGnzjiFajx9gAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fa2b1acf4e0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "exp_probs = exponent_weighting(252*1)\n",
    "plt.plot(exp_probs, linewidth=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Submission successful, please check on the coursera grader page for the status\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([ 0.00549361,  0.00547852,  0.00546347,  0.00544846,  0.0054335 ,\n",
       "        0.00541857,  0.00540369,  0.00538885,  0.00537404,  0.00535928,\n",
       "        0.00534456,  0.00532988,  0.00531524,  0.00530064,  0.00528608,\n",
       "        0.00527156,  0.00525708,  0.00524264,  0.00522824,  0.00521388,\n",
       "        0.00519956,  0.00518528,  0.00517103,  0.00515683,  0.00514267,\n",
       "        0.00512854,  0.00511445,  0.0051004 ,  0.00508639,  0.00507242,\n",
       "        0.00505849,  0.00504459,  0.00503074,  0.00501692,  0.00500314,\n",
       "        0.0049894 ,  0.00497569,  0.00496202,  0.00494839,  0.0049348 ,\n",
       "        0.00492125,  0.00490773,  0.00489425,  0.00488081,  0.0048674 ,\n",
       "        0.00485403,  0.0048407 ,  0.0048274 ,  0.00481414,  0.00480092,\n",
       "        0.00478773,  0.00477458,  0.00476146,  0.00474838,  0.00473534,\n",
       "        0.00472233,  0.00470936,  0.00469643,  0.00468353,  0.00467066,\n",
       "        0.00465783,  0.00464504,  0.00463228,  0.00461956,  0.00460687,\n",
       "        0.00459421,  0.00458159,  0.00456901,  0.00455646,  0.00454394,\n",
       "        0.00453146,  0.00451901,  0.0045066 ,  0.00449422,  0.00448188,\n",
       "        0.00446957,  0.00445729,  0.00444505,  0.00443284,  0.00442066,\n",
       "        0.00440852,  0.00439641,  0.00438433,  0.00437229,  0.00436028,\n",
       "        0.0043483 ,  0.00433636,  0.00432445,  0.00431257,  0.00430072,\n",
       "        0.00428891,  0.00427713,  0.00426538,  0.00425367,  0.00424198,\n",
       "        0.00423033,  0.00421871,  0.00420712,  0.00419557,  0.00418404])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "### GRADED PART (DO NOT EDIT) ###\n",
    "part_1=list(exp_probs[:100])\n",
    "try:\n",
    "    part1 = \" \".join(map(repr, part_1))\n",
    "except TypeError:\n",
    "    part1 = repr(part_1)\n",
    "submissions[all_parts[0]]=part1\n",
    "grading.submit(COURSERA_EMAIL, COURSERA_TOKEN, assignment_key,all_parts[:1],all_parts,submissions)\n",
    "exp_probs[:100]\n",
    "### GRADED PART (DO NOT EDIT) ###"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def absorption_ratio(explained_variance, n_components):\n",
    "    \"\"\"\n",
    "    Calculate absorption ratio via PCA. absorption_ratio() is NOT to be used with Auto-Encoder. \n",
    "    \n",
    "    Arguments:\n",
    "    explained_variance -- 1D np.array of explained variance by each pricincipal component, in descending order\n",
    "    \n",
    "    n_components -- an integer, a number of principal components to compute absorption ratio\n",
    "    \n",
    "    Return:\n",
    "    ar -- absorption ratio\n",
    "    \"\"\"\n",
    "    ar = np.sum(explained_variance[:n_components]) / np.sum(explained_variance)\n",
    "    return ar"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Part 2 (Implement Linear Auto-Encoder)\n",
    "\n",
    "LinearAutoEncoder class has two fully connected layers and no activation functions between the layers.\n",
    "\n",
    "**Instructions:**\n",
    "- fill missing code within LinearAutoEncoder class\n",
    "- in init() method of LinearAutoEncoder setup neural network\n",
    "    - **self.codings_layer** is a fully connected layer with **n_codings** neurons and no activation function\n",
    "    - **self.outputs** is a fully connected layer with **n_outputs** neurons and no activation function\n",
    "    - define loss function as Mean Square Error between the outputs and inputs referenced by **self.X** in the code\n",
    "    - use AdamOptimizer to optimize model parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def reset_graph(seed=42):\n",
    "    tf.reset_default_graph()\n",
    "    tf.set_random_seed(seed)\n",
    "    np.random.seed(seed)\n",
    "    \n",
    "class LinearAutoEncoder:\n",
    "    \"\"\"\n",
    "    To perform simple PCA, we set activation_fn=None \n",
    "    i.e., all neurons are linear and the cost function is the Mean-Square Error (MSE)\n",
    "    \"\"\"\n",
    "    def __init__(self, n_inputs, n_codings, learning_rate=0.01):\n",
    "        self.learning_rate = learning_rate\n",
    "        n_outputs = n_inputs\n",
    "        self.destroy()\n",
    "        reset_graph()\n",
    "    \n",
    "        # the inputs are n_inputs x n_inputs covariance matrices\n",
    "        self.X = tf.placeholder(tf.float32, shape=[None, n_inputs, n_inputs])\n",
    "        with tf.name_scope(\"lin_ae\"):\n",
    "            self.codings_layer = None\n",
    "            self.outputs = None\n",
    "            ### START CODE HERE ### (≈ 2 lines of code)\n",
    "            self.codings_layer = fully_connected(self.X, n_codings, activation_fn=None)\n",
    "            self.outputs = fully_connected(self.codings_layer, n_outputs, activation_fn=None)\n",
    "            ### END CODE HERE ###\n",
    "        \n",
    "        with tf.name_scope(\"loss\"):\n",
    "            self.reconstruction_loss = None\n",
    "            self.training_op = None\n",
    "            ### START CODE HERE ### (≈ 4-5 lines of code)\n",
    "            self.reconstruction_loss = tf.reduce_mean(tf.squared_difference(self.X, self.outputs))\n",
    "            self.training_op = tf.train.AdamOptimizer(learning_rate).minimize(self.reconstruction_loss)  \n",
    "            ### END CODE HERE ###\n",
    "            self.init = tf.global_variables_initializer()\n",
    "            \n",
    "    def destroy(self):\n",
    "        if hasattr(self, 'sess') and self.sess is not None:\n",
    "            self.sess.close()\n",
    "            self.sess = None\n",
    "\n",
    "    def absorption_ratio(self, test_input):\n",
    "        \"\"\"\n",
    "        Calculate absorption ratio based on already trained model\n",
    "        \"\"\"\n",
    "        if self.outputs is None:\n",
    "            return test_input, 0.\n",
    "        \n",
    "        with self.sess.as_default():  # do not close session\n",
    "            codings = self.codings_layer.eval(feed_dict={self.X: test_input})\n",
    "\n",
    "            # calculate variance explained ratio\n",
    "            result_ = self.outputs.eval(feed_dict={self.X: test_input})\n",
    "            var_explained = np.sum(np.diag(result_.squeeze())) / np.sum(np.diag(test_input.squeeze()))\n",
    "\n",
    "        return codings[0, :, :], var_explained\n",
    "    \n",
    "    def next_batch(self, X_train, batch_size):\n",
    "        \"\"\"\n",
    "        X_train - np.array of double of size K x N x N, where N is dimensionality of the covariance matrix\n",
    "        batch_size - an integer, number of training examples to feed through the nwtwork at once\n",
    "        \"\"\"\n",
    "        y_batch = None\n",
    "\n",
    "        selected_idx = np.random.choice(tuple(range(X_train.shape[0])), size=batch_size)\n",
    "        X_batch = X_train[selected_idx, :, :]\n",
    "        return X_batch, y_batch\n",
    "\n",
    "    def train(self, X_train, X_test, n_epochs=5, batch_size=2, verbose=False):\n",
    "        \"\"\"\n",
    "        train simple auto-encoder network\n",
    "        :param X_train:\n",
    "        :param X_test:\n",
    "        :param n_epochs: number of epochs to use for training the model\n",
    "        :param batch_size:\n",
    "        :return:\n",
    "        \"\"\"\n",
    "        if self.outputs is None:\n",
    "            return X_test, 0.\n",
    "        \n",
    "        n_examples = len(X_train)  # number of training examples\n",
    "        self.sess = tf.Session()\n",
    "        \n",
    "        # as_default context manager does not close the session when you exit the context,\n",
    "        # and you must close the session explicitly.\n",
    "        with self.sess.as_default():\n",
    "            self.init.run()\n",
    "            for epoch in range(n_epochs):\n",
    "                n_batches = n_examples // min(n_examples, batch_size)\n",
    "                for _ in range(n_batches):\n",
    "                    X_batch, y_batch = self.next_batch(X_train, batch_size)\n",
    "                    self.sess.run(self.training_op, feed_dict={self.X: X_batch})\n",
    "                \n",
    "                if verbose:\n",
    "                    # last covariance matrix from the training sample\n",
    "                    if X_train.shape[0] == 1:\n",
    "                        mse_train = self.reconstruction_loss.eval(feed_dict={self.X: X_train})\n",
    "                    else:\n",
    "                        mse_train = self.reconstruction_loss.eval(feed_dict={self.X: np.array([X_train[-1, :, :]])})\n",
    "                    mse_test = self.reconstruction_loss.eval(feed_dict={self.X: X_test})\n",
    "                    print('Epoch %d. MSE Train %.4f, MSE Test %.4f' % (epoch, mse_train, mse_test))\n",
    "\n",
    "            # calculate variance explained ratio\n",
    "            test_input = np.array([X_train[-1, :, :]])\n",
    "            result_ = self.outputs.eval(feed_dict={self.X: test_input})\n",
    "            var_explained = np.sum(np.diag(result_.squeeze())) / np.sum(np.diag(test_input.squeeze()))\n",
    "            # print('Linear Auto-Encoder: variance explained: %.2f' % var_explained)\n",
    "\n",
    "            codings = self.codings_layer.eval(feed_dict={self.X: X_test})\n",
    "            # print('Done training linear auto-encoder')\n",
    "\n",
    "        return codings[0, :, :], var_explained"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "time index and covariance matrix shape 1000 (504, 418)\n",
      "time index and covariance matrix shape 1060 (504, 418)\n",
      "time index and covariance matrix shape 1120 (504, 418)\n",
      "time index and covariance matrix shape 1180 (504, 418)\n",
      "time index and covariance matrix shape 1240 (504, 418)\n"
     ]
    }
   ],
   "source": [
    "### GRADED PART (DO NOT EDIT) ###\n",
    "ix_offset = 1000\n",
    "stock_tickers = asset_returns.columns.values[:-1]\n",
    "assert 'SPX' not in stock_tickers, \"By accident included SPX index\"\n",
    "\n",
    "step_size = 60\n",
    "num_samples = 5\n",
    "lookback_window = 252 * 2   # in (days)\n",
    "num_assets = len(stock_tickers)\n",
    "cov_matricies = np.zeros((num_samples, num_assets, num_assets)) # hold training data\n",
    "\n",
    "# collect training and test data\n",
    "ik = 0\n",
    "for ix in range(ix_offset, min(ix_offset + num_samples * step_size, len(normed_r)), step_size):\n",
    "    ret_frame = normed_r.iloc[ix_offset - lookback_window:ix_offset, :-1]\n",
    "    print(\"time index and covariance matrix shape\", ix, ret_frame.shape)\n",
    "    cov_matricies[ik, :, :] = ret_frame.cov()\n",
    "    ik += 1\n",
    "\n",
    "# the last covariance matrix determines the absorption ratio\n",
    "lin_ae = LinearAutoEncoder(n_inputs=num_assets, n_codings=200)\n",
    "np.array([cov_matricies[-1, :, :]]).shape\n",
    "lin_codings, test_absorp_ratio = lin_ae.train(cov_matricies[ : int((2/3)*num_samples), :, :],\n",
    "                                                np.array([cov_matricies[-1, :, :]]),\n",
    "                                                n_epochs=10, \n",
    "                                                batch_size=5)\n",
    "lin_codings, in_sample_absorp_ratio = lin_ae.absorption_ratio(np.array([cov_matricies[0, :, :]]))\n",
    "### GRADED PART (DO NOT EDIT) ###"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Submission successful, please check on the coursera grader page for the status\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.39359208195496026, 0.39359208195496026]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "### GRADED PART (DO NOT EDIT) ###\n",
    "part_2=[test_absorp_ratio, in_sample_absorp_ratio]\n",
    "try:\n",
    "    part2 = \" \".join(map(repr, part_2))\n",
    "except TypeError:\n",
    "    part2 = repr(part_2)\n",
    "submissions[all_parts[1]]=part2\n",
    "grading.submit(COURSERA_EMAIL, COURSERA_TOKEN, assignment_key,all_parts[:2],all_parts,submissions)\n",
    "[test_absorp_ratio, in_sample_absorp_ratio]\n",
    "### GRADED PART (DO NOT EDIT) ###"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Half-life = 252\n",
      "Lookback window = 504\n",
      "Step size = 1\n",
      "Variance Threshold = 0\n",
      "Number of stocks = 418\n",
      "Number of principal components = 83\n"
     ]
    }
   ],
   "source": [
    "stock_tickers = asset_returns.columns.values[:-1]\n",
    "assert 'SPX' not in stock_tickers, \"By accident included SPX index\"\n",
    "\n",
    "half_life = 252             # in (days)\n",
    "lookback_window = 252 * 2   # in (days)\n",
    "num_assets = len(stock_tickers)\n",
    "step_size = 1          # days : 5 - weekly, 21 - monthly, 63 - quarterly\n",
    "\n",
    "# require of that much variance to be explained. How many components are needed?\n",
    "var_threshold = 0.8     \n",
    "\n",
    "# fix 20% of principal components for absorption ratio calculation. How much variance do they explain?\n",
    "absorb_comp = int((1 / 5) * num_assets)  \n",
    "\n",
    "print('Half-life = %d' % half_life)\n",
    "print('Lookback window = %d' % lookback_window)\n",
    "print('Step size = %d' % step_size)\n",
    "print('Variance Threshold = %d' % var_threshold)\n",
    "print('Number of stocks = %d' % num_assets)\n",
    "print('Number of principal components = %d' % absorb_comp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# indexes date on which to compute PCA\n",
    "days_offset = 4 * 252\n",
    "num_days = 6 * 252 + days_offset\n",
    "pca_ts_index = normed_r.index[list(range(lookback_window + days_offset, min(num_days, len(normed_r)), step_size))]\n",
    "\n",
    "# allocate arrays for storing absorption ratio\n",
    "pca_components = np.array([np.nan]*len(pca_ts_index))\n",
    "absorp_ratio = np.array([np.nan]*len(pca_ts_index))\n",
    "lae_ar = np.array([np.nan]*len(pca_ts_index))  # absorption ratio computed by Auto-Encoder \n",
    "\n",
    "# keep track of covariance matricies as we would need them for training Auto-Encoder\n",
    "buf_size = 5\n",
    "cov_matricies = np.zeros((buf_size, num_assets, num_assets))\n",
    "\n",
    "exp_probs = exponent_weighting(lookback_window, half_life)\n",
    "assert 'SPX' not in normed_r.iloc[:lookback_window, :-1].columns.values, \"By accident included SPX index\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Instructions:**\n",
    "- on each loop iteration: \n",
    "    - fit PCA to **cov_mat**\n",
    "    - use fitted pca model to pass values to absorption_ratio(). The result of absorption ratio calculation goes into **absorp_ratio**\n",
    "    - compute number of principal components it takes to explain at least **var_threshold** of variance. The result of this calculation goes into **pca_components** "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Trainging AE 2006-02-07 00:00:00\n",
      "Trainging AE 2007-02-09 00:00:00\n",
      "Trainging AE 2008-02-11 00:00:00\n",
      "Trainging AE 2009-02-10 00:00:00\n",
      "Absorption Ratio done! Time elapsed: 38.2771418094635 seconds\n"
     ]
    }
   ],
   "source": [
    "# run the main loop computing PCA and absorption at each step using moving window of returns  \n",
    "# run this loop using both exponentially weighted returns and equally weighted returns\n",
    "import time\n",
    "from sklearn.decomposition import PCA\n",
    "\n",
    "ik = 0\n",
    "use_ewm = False\n",
    "lin_ae = None\n",
    "time_start = time.time()\n",
    "for ix in range(lookback_window + days_offset, min(num_days, len(normed_r)), step_size):\n",
    "    ret_frame = normed_r.iloc[ix - lookback_window:ix, :-1]  # fixed window\n",
    "    # ret_frame = normed_r.iloc[:ix, :-1]  # ever-growing window\n",
    "    if use_ewm:\n",
    "        ret_frame = (ret_frame.T * exp_probs).T\n",
    "    \n",
    "    cov_mat = ret_frame.cov()\n",
    "    circ_idx = ik % buf_size\n",
    "    cov_matricies[circ_idx, :, :] = cov_mat.values\n",
    "\n",
    "    if ik == 0 or ik % 21 == 0:\n",
    "        ### START CODE HERE ### (≈ 4-5 lines of code)\n",
    "        ### fit PCA, compute absorption ratio by calling absorption_ratio()\n",
    "        ### store result into pca_components for grading\n",
    "        pca = PCA().fit(cov_mat)\n",
    "        absorp_ratio[ik] = absorption_ratio(pca.explained_variance_, absorb_comp)\n",
    "        var_explained = np.cumsum(pca.explained_variance_ratio_)\n",
    "        pca_components[ik] = np.where(np.logical_not(var_explained < var_threshold))[0][0] + 1\n",
    "        ### END CODE HERE ###\n",
    "    else:\n",
    "        absorp_ratio[ik] = absorp_ratio[ik-1] \n",
    "        pca_components[ik] = pca_components[ik-1]\n",
    "    \n",
    "    if ik == 0 or ik % 252 == 0:        \n",
    "        if lin_ae is not None:\n",
    "            lin_ae.destroy()\n",
    "\n",
    "        print('Trainging AE', normed_r.index[ix])\n",
    "        lin_ae = LinearAutoEncoder(cov_mat.shape[0], absorb_comp)\n",
    "        lin_codings, lae_ar[ik] = lin_ae.train(cov_matricies[:circ_idx + 1, :, :], \n",
    "                                            np.array([cov_mat.values]),\n",
    "                                            batch_size=2)\n",
    "    else:\n",
    "        lin_codings, lae_ar[ik] = lin_ae.absorption_ratio(np.array([cov_mat.values]))\n",
    "\n",
    "    ik += 1\n",
    "    \n",
    "print ('Absorption Ratio done! Time elapsed: {} seconds'.format(time.time() - time_start))    \n",
    "ts_pca_components = pd.Series(pca_components, index=pca_ts_index)\n",
    "ts_absorb_ratio = pd.Series(absorp_ratio, index=pca_ts_index)\n",
    "ts_lae_absorb_ratio = pd.Series(lae_ar, index=pca_ts_index)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n2QAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fa2b1a40ef0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ts_absorb_ratio.plot(figsize=(12,6), title='Absorption Ratio via PCA', linewidth=3)\n",
    "plt.savefig(\"Absorption_Ratio_SPX.png\", dpi=900)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7fa26a6b84a8>"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n9nvtOxmPLwcuz3bb+PWtwJlDaayIiIiISCHRHRBFREQkr3QBohQzdaZFRERkxOkCRBkt1JkWERGR\nvNKJaSlmWY2ZFhEREQlJJ6alkKTSzq7OXto6e9jR0UNbZ0/W26ozLSIiIvmlQdMygnZ19XLfC5v4\n8RNreH79DpJmdPSkct6fOtMiIiIy4jRmWg6mrt4UO9p7SCSMDds7eHL1Nrbt7mZNazsPr2hmW3v2\nZ54Ho860iIiI5JXOSx9a0mkn7U5v2tne3sPTa7bR1LKbhBnb27vZ2dVLZ0+KsmSCCdVl1FeXU19d\nzpxJ1aTSTsuublp2dtGyq4vVW9vp7k3jRPva3NbJ5rZOWnZ1D7ldNeUl1FSUUFtZSl1lKa9muZ06\n0yIiIjLiTKOmR7V129q55eEmHlu1lc6eFI3jqphQXUbr7m6eaGqlqzed1/ZNqi3nfafM5C3HTWF8\ndRlVpUkSib1r8s4rs9uXOtMiIiIih5BU2unsSdGbdnpTaVJpjx87m9o62d3VS08qTW/a6Umlae9O\n8cyabaxuaSflTio+s5x2p7MnTWkywbiqUpIJoyRhtOzq5vn1O/b6nau3to/oe0wYjK0qA6AkYUwf\nX8X8aWOZPbGa2ROrOa6xjvKSZJDfpc60iIiI5JWuPwyrsyfFT55cy3PrtrN+WwdbdnZRlkwwpjzJ\ntvYeVm/dXRCZl5UkKC9JMG1cFSfOHE8q7YyrKqWhtoKKkgRdvWm27uqmeVcnS9ftYP22DsaPiYd9\n1JRTX13GYXWV1FWVYkBNRQmTaiuYXFdBfXU5pcmRmQFanWkREREZccV0AWI67WzZ2cWza7fzP4+/\nSmVpktPn1FNZVsIza7axoyOaTu3EGeP5wKIjKCsJ04lzdywOqieVZtOOTtLujK0qo66ydK91m3d2\nceODK1m2YQfPrt1OTyr/veX508by7pOm0ziukq6eNMs3tdGys5vXHVnPoiMb9ry3YqfOtIiIiOSV\n5+E0aWdPihseWMmLG9t422sOY0b9GNLuHD+1jl89v5HFz26gojTJtvZuHn1l6z7b//bFzfu89vCK\nFr7+u5epKE0ws76aBYePpXlnF2taO6ipKKGiNMmG7R3s6uwlYWBmlJUkOGxsBSWJBLWVpbymsY51\n2zr4zQub2Lq7i4TZgOOLJ9WWk0o7pckEcyfX8HhTK+3d2U/vVlGaoDSZoCRhJBMJSpNGMmHUVpTS\nUFNOadIoSSQoLUlQmjAqy5IcO7WO2ROrSVi0btKMtDsdPSlS8ZCQ3pRTUZrk8AlVTBtftdfvPGPu\nxKzbV0zUmRYREZERl89zku7O7U+s4YYHVwLwwJ+3BN1/Z0+a5RvbWL6xLav1m1p273l893Mb+i0d\n+EBjc1vXnscbd3Tus7wkYVx08uGcMXciU+oq6Eml6ehO0d2bZvakaibWVGTVNhmcOtMiIiKSVyHO\nS6/csov12zs49YgJbI1njJhQXUZVWQmTaytIu/P5u5dx37J9zyhna8aEKsyM6vKSPcNUpo+vYsHh\n47hn6UZeWL+D7lT6oI5Hrq8u2++0b9PGV/KRN8xh+vgq5kyqYfyYsoPXENlDnWkREREZcSHHy65t\nbefs6/9Ib9oZW1XK9hxuyDGrYQytu7v32fbsYybz+qMaOH9BIyUHuKDt0lNn7hmu0tbZy5LVraxp\nbWfLzi66e9MsOHwcu7t6SZhxzNRaqstLcIcdHT1sa++meWcXa1s72NTWQU/KmVBdxkUnHU59dTlt\nnT280ryL+dPGUlVWQmdPis1tnfSk0jzRtI2tu7o4bU4986eNHTXjkIuJOtMiIiKSV8M9k/vHFc30\npqOdDLUjfezUWhZ/6DQSCaM3leaJplYeWdnClLGVXHTS9CF1TvvWrass5cx5k7LaZloW61SWJZlU\n+5dhGdGY5DEAzJ5Yk3X75OBQZ1pERESKykubdrJ+eztHTa7ltkeauPWRpv2uO29KLS9v3kkq7Uwd\nW8l5J0zlnOMms7srxZadnZw0c8Kem3WUJBOcMrueU2bXj9RbkVFAnWkREREpCum0c9Y3HmJVxgV7\n/b3vlBm8/YSpzGoYQ21FNH1cR3eKlVt2cdTkmmDT1on0UWdaRERE8irbUR5PrG49YEc6YXDZqTOZ\nPmHvKdkqy5Ic11g3jBaK7J860yIiIjLicrlObm3r/m9J/TfHTOLNx03ZpyMtcrCpMy0iIiJ51f+m\nLb2pNI+sbGHa+CqOaKgGoiEemZ3p8xc0cvKsCZQmjbcef9iecc8iI02daRERERlx1u+2LQ+93MyN\nD6xk/vSxpNLOrY80kTB4w9xJ3L9837mh506u4fwFjSPVXJH9UmdaRERERlw642z0F361fM/jJ1a3\nZqzDgB1pgIaa8oPXOJEh0CWtIiIiMuKWrts+rO1n1VcHaonI8OjMtIiIiIy40gPcTfBAzpw7kWOn\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fa2605f2080>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ts_lae_absorb_ratio.plot(figsize=(12,6), title='Absorption Ratio via Auto-Encoder', linewidth=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Having computed daily (this means the step size is 1) Absorption Ratio times series, we further follow M. Kritzman to make use of AR to define yet another measure: AR Delta. In particular:\n",
    "$$ AR\\delta = \\frac{AR_{15d} - AR_{1y}}{ AR\\sigma_{1y}}$$\n",
    "We use  $AR\\delta$ to build simple portfolio trading strategy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nSUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fa26059e1d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# following Kritzman and computing AR_delta = (15d_AR -1yr_AR) / sigma_AR\n",
    "ts_ar = ts_absorb_ratio\n",
    "ar_mean_1yr = ts_ar.rolling(252).mean()\n",
    "ar_mean_15d = ts_ar.rolling(15).mean()\n",
    "ar_sd_1yr = ts_ar.rolling(252).std()\n",
    "ar_delta = (ar_mean_15d - ar_mean_1yr) / ar_sd_1yr    # standardized shift in absorption ratio\n",
    "\n",
    "df_plot = pd.DataFrame({'AR_delta': ar_delta.values, 'AR_1yr': ar_mean_1yr.values, 'AR_15d': ar_mean_15d.values}, \n",
    "                       index=ts_ar.index)\n",
    "df_plot = df_plot.dropna()\n",
    "if df_plot.shape[0] > 0:\n",
    "    df_plot.plot(figsize=(12, 6), title='Absorption Ratio Delta', linewidth=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Part 3 (AR Delta Trading Strategy)\n",
    "\n",
    "**Instructions:** Implement get_weight() function\n",
    "\n",
    "The AR Delta trading strategy forms a portfolio of EQ and FI, following these simple rules:\n",
    "\n",
    "* __$ -1\\sigma < AR < +1\\sigma $__\t 50 / 50 weights for EQ / FI\n",
    "* __$ AR > +1\\sigma $__\t             0 / 100 weights for EQ / FI\n",
    "* __$ AR < -1\\sigma $__\t             100 / 0 weights for EQ / FI\n",
    "\n",
    "Here we compute AR Delta strategy weights using data from the same data set. As expected, the average number of trades per year is very low."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# GRADED FUNCTION: get_weight\n",
    "def get_weight(ar_delta):\n",
    "    '''\n",
    "    Calculate EQ / FI portfolio weights based on Absorption Ratio delta\n",
    "    Arguments:\n",
    "    ar_delta -- Absorption Ratio delta\n",
    "    \n",
    "    Return: \n",
    "        wgts -- a vector of portfolio weights\n",
    "    '''\n",
    "    \n",
    "    ### START CODE HERE ### (≈ 6 lines of code)\n",
    "    ### ....\n",
    "    if ar_delta > 1:\n",
    "        return [0., 1.]\n",
    "    elif ar_delta < -1:\n",
    "        return [1., 0.]\n",
    "    return [0.5, 0.5]\n",
    "    ### END CODE HERE ###"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Average number of trades per year 1.50\n"
     ]
    }
   ],
   "source": [
    "### GRADED PART (DO NOT EDIT) ###\n",
    "ar_delta_data = ar_delta[251:]\n",
    "\n",
    "rebal_dates = np.zeros(len(ar_delta_data))\n",
    "wgts = pd.DataFrame(data=np.zeros((len(ar_delta_data.index), 2)), index=ar_delta_data.index, columns=('EQ', 'FI'))\n",
    "\n",
    "prtf_wgts = get_weight(ar_delta_data.values[0])\n",
    "wgts.iloc[0, :] = prtf_wgts\n",
    "for ix in range(1, len(ar_delta_data)):\n",
    "    prtf_wgts = get_weight(ar_delta_data.values[ix])\n",
    "    wgts.iloc[ix, :] = prtf_wgts\n",
    "    if wgts.iloc[ix-1, :][0] != prtf_wgts[0]:\n",
    "        prtf_wgts = wgts.iloc[ix, :]\n",
    "        rebal_dates[ix] = 1\n",
    "\n",
    "ts_rebal_dates = pd.Series(rebal_dates, index=ar_delta_data.index)\n",
    "ts_trades_per_year = ts_rebal_dates.groupby([ts_rebal_dates.index.year]).sum()\n",
    "print('Average number of trades per year %.2f' % ts_trades_per_year.mean())\n",
    "### GRADED PART (DO NOT EDIT) ###"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Submission successful, please check on the coursera grader page for the status\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([ 0.5,  1. ,  0. ,  0.5,  0.5,  0.5,  0. ,  0.5,  0.5,  1. ,  0.5,\n",
       "        0. ,  0. ,  0.5,  1. ,  0.5,  0.5,  0.5,  0.5,  0. ,  1. ,  0. ,\n",
       "        1. ,  1. ,  0.5,  1. ,  1. ,  1. ,  1. ,  1. ,  0. ,  0. ,  1. ,\n",
       "        1. ,  1. ,  0. ,  0.5,  0. ,  0.5,  0. ,  0.5,  0. ,  0.5,  1. ,\n",
       "        1. ,  0.5,  1. ,  0.5,  1. ,  1. ,  0. ,  1. ,  0.5,  1. ,  0. ,\n",
       "        1. ,  1. ,  0. ,  0. ,  0.5,  0. ,  0. ,  0. ,  0. ,  0. ,  0.5,\n",
       "        0.5,  0. ,  1. ,  1. ,  1. ,  0.5,  0.5,  1. ,  0.5,  1. ,  1. ,\n",
       "        1. ,  0. ,  0.5,  0. ,  1. ,  0. ,  1. ,  0. ,  0. ,  0.5,  0. ,\n",
       "        1. ,  1. ,  1. ,  1. ,  1. ,  0.5,  1. ,  1. ,  1. ,  1. ,  1. ,\n",
       "        0. ])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "### GRADED PART (DO NOT EDIT) ###\n",
    "np.random.seed(42)\n",
    "wgts_test = wgts.as_matrix()\n",
    "idx_row = np.random.randint(low=0, high=wgts_test.shape[0], size=100)\n",
    "np.random.seed(42)\n",
    "idx_col = np.random.randint(low=0, high=wgts_test.shape[1], size=100)\n",
    "\n",
    "# grading\n",
    "part_3=list(wgts_test[idx_row, idx_col])\n",
    "try:\n",
    "    part3 = \" \".join(map(repr, part_3))\n",
    "except TypeError:\n",
    "    part3 = repr(part_3)\n",
    "submissions[all_parts[2]]=part3\n",
    "grading.submit(COURSERA_EMAIL, COURSERA_TOKEN, assignment_key,all_parts[:3],all_parts,submissions)\n",
    "\n",
    "wgts_test[idx_row, idx_col]\n",
    "### GRADED PART (DO NOT EDIT) ###"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now that weights have been determined, run the re-balancing strategy using time series of returns and compute\n",
    " - sharpe of the strategy\n",
    " - strategy annualized return\n",
    " - strategy annualized volatility\n",
    "\n",
    "Contrast this with 50 / 50 Equity / Fixed Income ETF strategy performance using the same performance metrics. Use VTI as Equity and AGG as Fixed Income assets."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>VTI</th>\n",
       "      <th>AGG</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Index</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2003-09-29</th>\n",
       "      <td>0.005862</td>\n",
       "      <td>-0.002734</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-09-30</th>\n",
       "      <td>-0.006036</td>\n",
       "      <td>0.005188</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-10-01</th>\n",
       "      <td>0.020000</td>\n",
       "      <td>-0.000486</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-10-02</th>\n",
       "      <td>0.004516</td>\n",
       "      <td>-0.001560</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-10-03</th>\n",
       "      <td>0.010935</td>\n",
       "      <td>-0.007219</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 VTI       AGG\n",
       "Index                         \n",
       "2003-09-29  0.005862 -0.002734\n",
       "2003-09-30 -0.006036  0.005188\n",
       "2003-10-01  0.020000 -0.000486\n",
       "2003-10-02  0.004516 -0.001560\n",
       "2003-10-03  0.010935 -0.007219"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "etf_r= pd.read_csv(os.getcwd() + '/data/pca_hw5_etf_returns.csv',\n",
    "                     date_parser=lambda dt: pd.to_datetime(dt, format='%Y-%m-%d'),\n",
    "                     index_col = 0)\n",
    "etf_prices = pd.read_csv(os.getcwd() + '/data/millenials_portfolio_etfs.csv',\n",
    "                         date_parser=lambda dt: pd.to_datetime(dt, format='%Y-%m-%d'),\n",
    "                         index_col = 0)\n",
    "etf_returns = etf_prices.pct_change(periods=1)\n",
    "etf_returns = etf_returns.iloc[1450:, :]\n",
    "etf_r.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Part 4 (Calculate performance of backtested strategy)\n",
    "\n",
    "**Instructions:**\n",
    "\n",
    "Implement function backtest_strategy which given a DataFrame of strategy weights and a DataFrame asset returns annualized return, volatility and Sharpe ratio of a strategy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# GRADED FUNCTION: backtest_strategy\n",
    "def backtest_strategy(strat_wgts, asset_returns, periods_per_year = 252):\n",
    "    '''\n",
    "    Calculate portfolio returns and return portfolio strategy performance\n",
    "    Arguments:\n",
    "    \n",
    "    strat_wgts -- pandas.DataFrame of weights of the assets\n",
    "    asset_returns -- pandas.DataFrame of asset returns\n",
    "    periods_per_year -- number of return observations per year\n",
    "    \n",
    "    Return: \n",
    "        (ann_ret, ann_vol, sharpe) -- a tuple of (annualized return, annualized volatility, sharpe ratio)\n",
    "    '''\n",
    "\n",
    "    ### START CODE HERE ### (≈ 10 lines of code)\n",
    "    df_ = strat_wgts.join(asset_returns)\n",
    "    df_['EQ_returns'] = df_['EQ'] * df_['VTI']\n",
    "    df_['FI_returns'] = df_['FI'] * df_['AGG']\n",
    "    annualized_return = (df_['EQ_returns'].mean() + df_['FI_returns'].mean()) * periods_per_year\n",
    "    annualized_vol = (df_['EQ_returns'] + df_['FI_returns']).std() * np.sqrt(periods_per_year)\n",
    "    sharpe_ratio = annualized_return / annualized_vol\n",
    "    return annualized_return, annualized_vol, sharpe_ratio\n",
    "#     return 0., 0., 1. # annualized return,  annualized volatility,  sharp ratio\n",
    "    ### END CODE HERE ###"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Absorption Ratio strategy: 0.05620781048310971 0.0932706438441 0.602631312131\n",
      "Equally weighted: 0.01593457450945525 0.151485012475 0.105189115735\n"
     ]
    }
   ],
   "source": [
    "### GRADED PART (DO NOT EDIT) ###\n",
    "ann_ret, ann_vol, sharpe = backtest_strategy(wgts, etf_r)\n",
    "print('Absorption Ratio strategy:', ann_ret, ann_vol, sharpe)\n",
    "\n",
    "eq_wgts = wgts.copy()\n",
    "eq_wgts.iloc[:, ] = 0.5\n",
    "ann_ret_eq_wgt, ann_vol_eq_wgt, sharpe_eq_wgt = backtest_strategy(eq_wgts, etf_r)\n",
    "print('Equally weighted:', ann_ret_eq_wgt, ann_vol_eq_wgt, sharpe_eq_wgt)\n",
    "### GRADED PART (DO NOT EDIT) ###"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Submission successful, please check on the coursera grader page for the status\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.05620781048310971,\n",
       " 0.093270643844144935,\n",
       " 0.60263131213110155,\n",
       " 0.01593457450945525,\n",
       " 0.15148501247528315,\n",
       " 0.10518911573549358]"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "### GRADED PART (DO NOT EDIT) ###\n",
    "part_4=[ann_ret, ann_vol, sharpe, ann_ret_eq_wgt, ann_vol_eq_wgt, sharpe_eq_wgt]\n",
    "try:\n",
    "    part4 = \" \".join(map(repr, part_4))\n",
    "except TypeError:\n",
    "    part3 = repr(part_4)\n",
    "submissions[all_parts[3]]=part4\n",
    "grading.submit(COURSERA_EMAIL, COURSERA_TOKEN, assignment_key,all_parts[:4],all_parts,submissions)\n",
    "[ann_ret, ann_vol, sharpe, ann_ret_eq_wgt, ann_vol_eq_wgt, sharpe_eq_wgt]\n",
    "### GRADED PART (DO NOT EDIT) ###"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "celltoolbar": "Edit Metadata",
  "coursera": {
   "course_slug": "machine-learning-in-finance"
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
